import axios from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'
import qs from 'qs'
const request = axios.create({
  // 配置选项
})

function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

function refreshToken () {
  console.log('重置token')
  return axios.create()({
    method: 'POST',
    url: '/front/user/refresh_token',
    data: qs.stringify({
      refreshtoken: store.state.user.refresh_token
    })
  })
}

// 请求拦截器
request.interceptors.request.use(function (config) {
  const user = store.state.user
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }

  return config
}, function (error) {
  return Promise.reject(error)
})
// 响应拦截器
let isRfreshing = false
let requests:any[] = []
request.interceptors.response.use(function (response) {
  return response
}, async function (error) {
  if (error.response) { // 收到响应了，但是响应码不是2开头
    // 401 touken过期
    // 403 没权限
    // 404 找不到请求
    const { status } = error.response

    switch (status) {
      case 400: { Message.error('请求参数错误'); break }
      case 401: {
        // touken无效
        if (!store.state.user) {
          redirectLogin()
        }
        if (!isRfreshing) {
          isRfreshing = true
          // 获取新的touken
          return refreshToken().then(res => {
            if (!res.data.success) {
              throw new Error('刷新token失败')
            }

            store.commit('setUser', res.data.content)
            requests.forEach(element => element())
            requests = []
            return request(error.config)
          }).catch(error => {
            store.commit('setUser', null)
            redirectLogin()
            return Promise.reject(error)
          }).finally(() => {
            isRfreshing = false
          })
        }

        return new Promise(resolve => {
          requests.push(() => {
            resolve(request(error.config))
          })
        })
      }
      case 403: { Message.error('没有权限，请联系管理员。'); break }
      case 404: { Message.error('请求资源不存在'); break }
      default: {
        Message.error('服务端错误，请联系管理员')
      }
    }
  } else if (error.request) { // 没有收到相应
    Message.error('请求超时，请刷新重试')
  } else { // 位置错误，一般是请求时有错误
    Message.error(`请求失败:，${error.message}`)
  }

  return Promise.reject(error)// 把错误对象继续抛出，扔给上一个调用者，即发请求的部分。
})

export default request
